// 声明三个函数，模拟数学操作
float foo(int i, int j);
float bar(float a, float b, float c);
float baz(float b);

// 主计算函数
void work(int N, int M, float **A, float **B, float **C) {
    int i, j;

    // 并行双层 for 循环，使用 ordered(2) 支持二维 doacross
    #pragma omp for ordered(2)
    for (i = 1; i < N; i++) {
        for (j = 1; j < M; j++) {

            // 独立计算 A[i][j]
            A[i][j] = foo(i, j);

            // 等待依赖于上方 (i-1, j) 和左边 (i, j-1) 的值
            #pragma omp ordered doacross(sink: i-1,j) doacross(sink: i,j-1)
            B[i][j] = bar(A[i][j], B[i-1][j], B[i][j-1]);

            // 本迭代完成，发出完成信号供后续迭代使用
            #pragma omp ordered doacross(source:)
            C[i][j] = baz(B[i][j]);
        }
    }
}
